package com.jiangruan.javainspect.request;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.Map;
import java.util.Set;

/**
 * @author:liyaqi
 * @email:3441520483@qq.com
 * @desc:该类用于封装提供网络请求的功能的代码，用于发起网络请求，并将网络的数据进行返回
 * @datatime: 2021/12/8 15:50
 */
public class HttpUtils {
    /**
     * 该函数用于实现get请求，并将请求的结果返回
     *
     * @param path 请求的路径
     * @return 请求的结果
     */
    public static String get(String path) {
        BufferedReader reader = null;
        InputStreamReader inputStreamReader = null;
        InputStream inputStream = null;

        String line = "";//最开始空行
        String result = "";//每次读取到后都要累计起来的读取结果
        //path请求的路径
        try {
            //Union Resource Location  统一资源定位
            URL url = new URL(path);
            URLConnection connection = url.openConnection();
            //进行连接
            connection.connect();

            inputStream = connection.getInputStream();
            //字符流：按行读
            //转换
            inputStreamReader = new InputStreamReader(inputStream);
            reader = new BufferedReader(inputStreamReader);
//           String line = reader.readLine();
//            while (line != null){
//                reader.readLine();
//            }
            //判断是否能够读取到信息
            while ((line = reader.readLine()) != null) {
                result += line;
            }

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //关闭读取流  从下往上关
            try {
                if (reader != null) {
                    reader.close();

                }
                if (inputStreamReader != null) {
                    inputStreamReader.close();
                }
                if (inputStream != null) {
                    inputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return result;
    }
    /*
    * 该方法用于实现发送一个post请求，并将请求的解析到返回
    * @param path   要请求的资源路径
    * @param header     请求头信息
    *@param data    请求体数据
    * @return   请求的响应结果
    * */

    public static String post(String path , Map<String , String> header , byte[] data){
        BufferedReader reader = null;//读取响应结果的字符读取流
        OutputStream output = null;
        String result = "";//最后的结果
        try {
            URL url = new URL(path);
           HttpURLConnection conn = (HttpURLConnection) url.openConnection();
           conn.setRequestMethod("POST");//设置为post请求

            conn.setDoInput(true);//允许从服务端接收数据
            conn.setDoOutput(true);//允许向服务端发送数据
            //设置请求头
            //ContentType:application/json
            //Authorization: "Basic" +base64(用户名+密码)
            //Property:属性
            if (!header.isEmpty()){
                //如果请求头不为空，则要将用户需要的属性设置到请求头中
                //java中遍历map
               Set<String> keys =  header.keySet();
               //java中遍历set
                for (String key : keys){
                    String value =  header.get(key);
                    //将拿到的key和value设置到请求头属性中、
                    conn.setRequestProperty(key,value);

                }
            }
            //先连接
            conn.connect();

            //输出流
           output =  conn.getOutputStream();
            //将请求的数据发送出去（发送给服务端）
            output.write(data);
            output.flush();
            //接受响应数据
            reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String line = null;
            while ((line = reader.readLine()) != null){
                result += line;
            }


        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
            if (reader != null) {

                reader.close();
            }
            if (output != null){
                output.close();
            }
                } catch (IOException e) {
                    e.printStackTrace();
                }


        }
        return result;

    }
}
